#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Project    : AutomatedTesting
# @Name       : custom_assert.py
# @IDE        : PyCharm
# @Author     : OneYoung
# @Created    : 2025/9/5 19:34
# @Desc       : 自定义断言，封装常用的断言信息

from utils.log_record import logger


def assert_response_normal(response):
    """
    断言响应信息是否正常

    :param response: 响应结果
    """
    try:
        status_code = response.status_code
        if 200 <= status_code <= 299:
            pass
        elif 300 <= status_code <= 399:
            msg = f"断言失败，URL重定向 -> {status_code}."
            logger.error(msg)
            raise AssertionError(msg)
        elif 400 <= status_code <= 499:
            msg = f"断言失败，请求错误 -> {status_code}."
            logger.error(msg)
            raise AssertionError(msg)
        elif 500 <= status_code <= 599:
            msg = f"断言失败，服务器错误 -> {status_code}."
            logger.error(msg)
            raise AssertionError(msg)
        else:
            msg = f"断言失败，其他错误 -> {status_code}."
            logger.error(msg)
            raise AssertionError(msg)
    except AttributeError:
        msg = "断言失败，Response为空."
        logger.error(msg)
        raise AssertionError(msg)


def assert_status_code_equal(response, code: int = 200):
    """
    断言HTTP状态码是否与预期一致

    :param response: 响应结果
    :param code: HTTP状态码，默认200
    """
    status_code = response.status_code
    if status_code != code:
        msg = f"断言失败，HTTP状态码与预期不一致,预期:{code},实际:{status_code}."
        logger.error(msg, response.text)
        raise AssertionError(msg)


def assert_code_equal(response, code: int = 200):
    """
    断言响应状态码是否与预期一致

    :param response: 响应结果
    :param code: 响应状态码，默认200
    """
    try:
        error_code = response.json().get('code')  # 响应状态码可根据实际场景更改，如：errorCode
        if error_code != code:
            msg = f"断言失败，响应状态码与预期不一致,预期:{code},实际:{error_code}."
            logger.error(msg)
            raise AssertionError(msg)
    except Exception as e:
        logger.error(f"响应结果不正确，{e}")
        raise AssertionError('断言失败，响应结果不正确')


def assert_desc_equal(response, desc: str):
    """
    断言描述信息是否与预期一致

    :param response: 响应结果
    :param desc: 描述信息
    """
    try:
        response_json = response.json()
        r_desc = response_json.get('msg')  # 描述信息可根据实际场景更改，如：description
        if r_desc != desc:
            msg = f"断言失败，描述信息与预期不一致,预期:{desc},实际:{r_desc}."
            logger.error(msg)
            raise AssertionError(msg)
    except Exception as e:
        logger.error(f"响应结果不正确，{e}")
        raise AssertionError('断言失败，响应结果不正确')


def assert_elapsed_time_less(response, elapsed: int):
    """
    断言响应时间是否小于预期值

    :param response: 响应结果
    :param elapsed: 响应时间(s)
    """
    res_elapsed = response.elapsed.total_seconds()
    if res_elapsed > elapsed:
        msg = f"断言失败，响应时间大于预期时间,预期:{elapsed}(s),实际:{res_elapsed}(s)"
        logger.error(msg)
        raise AssertionError(msg)


def assert_data_equal(data, expected_data):
    """
    判断数据是否相等

    :param data: 需要对比的数据
    :param expected_data: 预期数据
    """
    if data != expected_data:
        msg = f"断言失败，数据不一致,预期:{expected_data},实际:{data}."
        logger.error(msg)
        raise AssertionError(msg)


def assert_data_not_equal(data, expected_data):
    """
    判断数据是否不等

    :param data: 返回结果
    :param expected_data: 预期结果
    """
    if data == expected_data:
        msg = f"断言失败，返回结果与预期结果一致."
        logger.error(msg)
        raise AssertionError(msg)


def assert_data_not_none(data):
    """
    断言数据不为空

    :param data: 断言数据
    """
    if not data:
        msg = "断言失败，数据为空."
        logger.error(msg)
        raise AssertionError(msg)


def assert_data_include(data, expected_data):
    """
    断言数据是否包含预期信息

    :param data: 断言信息
    :param expected_data: 预期信息
    """
    if expected_data not in data:
        msg = "断言失败，断言数据未包含预期信息."
        logger.error(msg)
        raise AssertionError(msg)
